package com.xing.binbackend.topology.remote;

import lombok.extern.slf4j.Slf4j;

/**
 * 从 Spring Framework 5 开始
 * 引入了一个名为 WebClient 的新 HTTP 客户端 来替代 RestTemplate
 * 提供传统同步API，还支持费阻塞和异步方法，未来版本中，RestTemplate将会被废弃！
 */
@Slf4j
//@Component
public class RestTemplateService {

//    @Resource
//    private RestTemplate restTemplate;
//
//    @Resource
//    private ObjectMapper mapper;
//
//    private static final List<File> fileList = new ArrayList<>();
//
//    /**
//     * get请求
//     *
//     * @param api 请求url
//     * @return xx
//     */
//    public String getData(String api) {
//        return this.getData(api, null, null);
//    }
//
//    /**
//     * get请求
//     *
//     * @param api    请求url
//     * @param reqObj 请求request实体
//     * @return xx
//     */
//    public String getData(String api, Object reqObj) {
//        return this.getData(api, reqObj, null);
//    }
//
//    /**
//     * get请求
//     *
//     * @param api        请求url
//     * @param reqObj     请求request实体
//     * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
//     * @return String
//     */
//    public String getData(String api, Object reqObj, Map<String, String> addHeaders) {
//        String requestUrl = api;
//        // 参数处理
//        if (Objects.nonNull(reqObj)) {
//            Map<String,Object> paramsMap;
//            if (reqObj instanceof JsonNode) {
//                JsonNode jsonNode = (JsonNode) reqObj;
//                paramsMap = convertJsonNodeToMap(jsonNode);
//            } else {
//                paramsMap = mapper.convertValue(reqObj, Map.class);
//            }
//            //将map转换为query参数
//            String queryParams = getUrlParamsByMap(paramsMap);
//            if (api.contains("?")) {
//                requestUrl = api + "&" + queryParams;
//            } else {
//                requestUrl = api + "?" + queryParams;
//            }
//        }
//        HttpEntity<String> entity = this.getMethodHttpEntity(addHeaders);
//        ResponseEntity<String> responseEntity = restTemplate.exchange(URI.create(requestUrl),
//                HttpMethod.GET, entity, String.class);
//        return responseEntity.getBody();
//    }
//
//    private static Map<String, Object> convertJsonNodeToMap(JsonNode jsonNode) {
//        Map<String, Object> map = new HashMap<>();
//        Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields();
//        while (fields.hasNext()) {
//            Map.Entry<String, JsonNode> entry = fields.next();
//            String key = entry.getKey();
//            JsonNode value = entry.getValue();
//            if (value.isValueNode()) {
//                map.put(key, value.asText());
//            } else {
//                map.put(key, convertJsonNodeToMap(value));
//            }
//        }
//        return map;
//    }
//
//    /**
//     * form-data的post请求
//     *
//     * @param requestUrl 请求url
//     * @param reqObj     请求request实体
//     * @return xx
//     */
//    public String postFormData(String requestUrl, Map<String, Object> reqObj) {
//        return this.postFormData(requestUrl, reqObj, null);
//    }
//
//    /**
//     * form-data的post请求
//     *
//     * @param requestUrl 请求url
//     * @param reqObj     请求request实体
//     * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
//     * @return xx
//     */
//    public String postFormData(String requestUrl, Map<String, Object> reqObj,
//                               Map<String, String> addHeaders) {
//        HttpEntity<MultiValueMap<String, Object>> entity = this.getFormRequestHttpEntity(reqObj,
//                MediaType.MULTIPART_FORM_DATA_VALUE, addHeaders);
//        String resText = restTemplate.postForObject(requestUrl, entity, String.class);
//        clearFileList();//清空缓存文件
//        return resText;
//    }
//
//    /**
//     * x-www-form-urlencoded的post请求
//     *
//     * @param requestUrl 请求url
//     * @param reqObj     请求request实体
//     * @return xx
//     */
//    public String postFormUrlencoded(String requestUrl, Map<String, Object> reqObj) {
//        return this.postFormUrlencoded(requestUrl, reqObj, null);
//    }
//
//    /**
//     * x-www-form-urlencoded的post请求
//     *
//     * @param requestUrl 请求url
//     * @param reqObj     请求request实体
//     * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
//     * @return xx
//     */
//    public String postFormUrlencoded(String requestUrl, Map<String, Object> reqObj, Map<String,
//            String> addHeaders) {
//        HttpEntity<MultiValueMap<String, Object>> entity = this.getFormRequestHttpEntity(reqObj,
//                MediaType.APPLICATION_FORM_URLENCODED_VALUE, addHeaders);
//        String resText = restTemplate.postForObject(requestUrl, entity, String.class);
//        clearFileList();//清空缓存文件
//        return resText;
//    }
//
//    /**
//     * json的post请求
//     *
//     * @param requestUrl 请求url
//     * @param reqObj     请求request实体
//     * @return xx
//     */
//    public String postJsonData(String requestUrl, Object reqObj) {
//        return this.postJsonData(requestUrl, reqObj, null);
//    }
//
//    /**
//     * json的post请求
//     *
//     * @param requestUrl 请求url
//     * @param reqObj     请求request实体
//     * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
//     * @return xx
//     */
//    public String postJsonData(String requestUrl, Object reqObj, Map<String, String> addHeaders) {
//        HttpEntity<String> entity = this.getJsonRequestHttpEntity(reqObj, addHeaders);
//        return restTemplate.postForObject(requestUrl, entity, String.class);
//    }
//
//    /**
//     * 请求request实体转form-data的map
//     *
//     * @param reqObj 请求request实体
//     * @return \xx
//     */
//    public MultiValueMap<String, Object> requestBeanToFormParams(Map<String, Object> reqObj) {
//        MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
//        for (String key : reqObj.keySet()) {
//            if (reqObj.get(key) instanceof String) {
//                multiValueMap.add(key, reqObj.get(key));
//            }
//            if (reqObj.get(key) instanceof File) {
//                FileSystemResource resource = new FileSystemResource((File) reqObj.get(key));
//                multiValueMap.add(key, resource);
//            }
//            if (reqObj.get(key) instanceof MultipartFile) {
//                File file = multipartFileToFile((MultipartFile) reqObj.get(key));
//                FileSystemResource resource = new FileSystemResource(file);
//                multiValueMap.add(key, resource);
//            }
//        }
//        return multiValueMap;
//    }
//
//    /**
//     * 获取get方法的HttpEntity
//     *
//     * @param addHeaders 添加的头部
//     * @return xx
//     */
//    public HttpEntity<String> getMethodHttpEntity(Map<String, String> addHeaders) {
//        HttpHeaders headers = this.getJsonDataHttpHeaders();
//        this.addHeaders(headers, addHeaders);
//        HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);
//        return requestEntity;
//    }
//
//    /**
//     * 获取form请求的HttpEntity
//     *
//     * @param reqObj      请求request实体
//     * @param contentType form请求类型
//     * @param addHeaders  添加的头部
//     * @return xx
//     */
//    public HttpEntity<MultiValueMap<String, Object>> getFormRequestHttpEntity(Map<String, Object> reqObj, String contentType, Map<String, String> addHeaders) {
//        HttpHeaders headers = null;
//        if (MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(contentType)) {
//            headers = this.getFormUrlencodedHttpHeaders();
//        } else if (MediaType.MULTIPART_FORM_DATA_VALUE.equals(contentType)) {
//            headers = this.getFormDataHttpHeaders();
//        }
//        this.addHeaders(headers, addHeaders);
//        MultiValueMap<String, Object> multiValueMap = this.requestBeanToFormParams(reqObj);
//        return new HttpEntity<>(multiValueMap, headers);
//    }
//
//    /**
//     * 获取json请求的HttpEntity
//     *
//     * @param obj        请求request实体
//     * @param addHeaders 添加的头部
//     * @return xx
//     */
//    public HttpEntity<String> getJsonRequestHttpEntity(Object obj, Map<String, String> addHeaders) {
//        HttpHeaders headers = this.getJsonDataHttpHeaders();
//        this.addHeaders(headers, addHeaders);
//        String params = null;
//        if (obj instanceof JSONObject) {
//            params = obj.toString();
//        } else {
//            params = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
//        }
//        HttpEntity<String> entity = new HttpEntity<>(params, headers);
//        return entity;
//    }
//
//    /**
//     * 获取x-www-form-urlencoded请求头
//     *
//     * @return
//     */
//    public HttpHeaders getFormUrlencodedHttpHeaders() {
//        HttpHeaders headers = this.getHttpHeaders(MediaType.APPLICATION_FORM_URLENCODED);
//        return headers;
//    }
//
//    /**
//     * 获取form-data请求头
//     *
//     * @return
//     */
//    public HttpHeaders getFormDataHttpHeaders() {
//        HttpHeaders headers = this.getHttpHeaders(MediaType.MULTIPART_FORM_DATA);
//        return headers;
//    }
//
//    /**
//     * 获取json请求头
//     *
//     * @return
//     */
//    public HttpHeaders getJsonDataHttpHeaders() {
//        HttpHeaders headers = this.getHttpHeaders(MediaType.APPLICATION_JSON);
//        return headers;
//    }
//
//    /**
//     * 获取指定mediaType请求头
//     *
//     * @param mediaType
//     * @return
//     */
//    public HttpHeaders getHttpHeaders(MediaType mediaType) {
//        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(mediaType);
//        return headers;
//    }
//
//    /**
//     * 添加自定义的头部
//     *
//     * @param headers
//     * @param addHeaders
//     */
//    public void addHeaders(HttpHeaders headers, Map<String, String> addHeaders) {
//        if (addHeaders != null) {
//            for (String key : addHeaders.keySet()) {
//                if ("Bearer-Auth".equals(key)) {//jwt授权
//                    headers.setBearerAuth(addHeaders.get(key));
//                    continue;
//                }
//                headers.set(key, addHeaders.get(key));
//            }
//        }
//    }
//
//    /**
//     * 将map转换成url
//     *
//     * @param source
//     * @return 字符串
//     */
//    public static String getUrlParamsByMap(Map<String, Object> source) {
//        Iterator<String> it = source.keySet().iterator();
//        StringBuilder paramStr = new StringBuilder();
//        while (it.hasNext()) {
//            String key = it.next();
//            String value = (String) source.get(key);
//            if (StringUtils.isEmpty(value)) {
//                continue;
//            }
//            try {
//                // URL 编码
//                value = URLEncoder.encode(value, "utf-8");
//            } catch (UnsupportedEncodingException e) {
//                // do nothing
//            }
//            paramStr.append("&").append(key).append("=").append(value);
//        }
//        // 去掉第一个&
//        return paramStr.substring(1);
//    }
//
//    /**
//     * MultipartFile 转 File
//     */
//    public static File multipartFileToFile(MultipartFile multipartFile) {
//        try {
//            File file = new File(multipartFile.getOriginalFilename());
//            FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
//            fileList.add(file); // 加入到缓存列表
//            return file;
//        } catch (IOException e) {
//            log.warn("multipartFileToFile error: {}", e.toString());
//        }
//        return null;
//    }
//
//    /**
//     * 清空缓存文件
//     */
//    public static void clearFileList() {
//        if (fileList.isEmpty()) return;
//        for (File file : fileList) {
//            file.delete();
//        }
//    }
//
//    public JsonNode doRequest(String url, HttpHeaders header, Map<String, Object> body) {
//        HttpEntity httpEntity = new HttpEntity(body, header);
//        ResponseEntity<JsonNode> response = restTemplate.exchange(url, HttpMethod.GET, httpEntity
//                , JsonNode.class);
//        return response.getBody();
//    }
}
